/**
 * 快捷键注册
 */
import { Viewer } from '../../../types'
import { createId } from '../../../utils'
import { HotkeyParams, HotkeyType } from './useHotkey'

/** 快捷键操作方法参数 */
export interface HotkeyHandlerParams extends HotkeyParams {
  /** 合同组件实例 */
  viewer: Viewer
}

/** 操作方法 */
export type HotkeyHandler = (params: HotkeyHandlerParams) => void | false | Promise<void>

/** 快捷键注册项 */
export interface HotkeyRegisterItem {
  /** 按键名称 */
  keys?: string | string[]

  /** 按键编码 */
  codes?: string | string[]

  /**
   * 热键类型
   * - 注意，苹果下 Cmd 组合键无法监听 `keyup`
   */
  type?: HotkeyType

  /**
   * 是否 Ctrl 或者 Cmd 键
   * - 注意，苹果下 Cmd 组合键无法监听 `keyup`
   */
  ctrlOrCmd?: boolean

  /** 执行间隔，在时间段内不重复执行 */
  interval?: number

  /** 上次触发时间 */
  lastTime?: number

  /** 注册项 id，用于移除注册 */
  id?: string

  /** 操作 */
  handler: HotkeyHandler
}

/** 快捷键注册 */
export default class HotkeyRegister {
  /** 已注册的按键 */
  list: HotkeyRegisterItem[] = []

  /**
   * 注册快捷键
   * @description 返回注册 id 用于取消注册
   */
  add(item: HotkeyRegisterItem) {
    const id = createId()
    this.list.push({ ...item, id })
    return id
  }

  /** 取消注册 */
  remove(id: string) {
    const { list } = this

    const idx = list.findIndex(item => item.id === id)

    if (idx > -1) {
      list.splice(idx, 1)
    }
  }
}
